import {isJSON} from "@/utils/soul";

const storage = ()=>{

    const session = (isTime=true)=>{
        return cache(sessionStorage,isTime);
    }

    const local = (isTime=false)=>{
        return cache(localStorage, isTime)
    }
    return {
        session,local
    }
}

export default {
    session : storage().session(false),
    local : storage().local(false),
    sessionExpire : storage().session(true),
    localExpire : storage().local(true),

}
function cache(storage=sessionStorage,isTime=true){
    /**
     * 默认的存储时间（天）
     */
    const expireTime = 1
    /**
     * 设置缓存数据
     * @param key
     * @param value
     * @param expire 过期时间，单位天
     */
    function set(key, value, expire) {
        if (!isTime && typeof value === "object"){
            storage.setItem(key, JSON.stringify(value))
            return;
        }
        const data =isTime ? JSON.stringify( {
            value,
            expire: expire !== undefined ? Date.now() + expire * 60 * 60 * 24 * 7 * 1000 : expireTime,
        }): value;
        storage.setItem(key, data)
    }

    /**
     * 获取缓存数据
     * @param key
     */
    function get(key) {
        const data = storage.getItem(key)
        if (data) {
            if (!isTime){
                return isJSON(data) ? JSON.parse(data) : data;
            }
            const {value, expire} = JSON.parse(data);
            // 在有效期内直接返回
            if ([null, undefined].includes(expire) || expire >= Date.now()) {
                return value;
            }
            // 清除缓存
            remove(key)
            return null
        }
    }

    /**
     * 清除缓存
     * @param key
     */
    function remove(key) {
        storage.removeItem(key)
    }

    /**
     * 清除缓存，除系统配置外
     */
    function clear() {
        const keys = [];
        for (let i = 0; i < storage.length; i++) {
            keys.push(storage.key(i) )
        }
        keys.map(key => {
            remove(key)
        })
    }
    return {
        get,
        set,
        clear,
        remove,
    }
}
